#!/usr/bin/env python
#_*_coding:utf-8 _*_
__author__ = 'silence'
import re

#test = "13 - 15 + 20"
#test = "2 * 4 / 5"
#test = "-12 - ((56 - 2) * 4) * (3 + 8 / 2)"
#test_str = ''.join([x for x in test if x != ' '])

#定义加法匹配规则
add_sub_p = re.compile(r"(-?\d+)(\.\d+)?(-|\+)(-?\d+)(\.\d+)?")
#定义乘除匹配规则
mul_div_p = re.compile(r"(-?\d+)(\.\d+)?(\*|/)(-?\d+)(\.\d+)?")
#定义(*-)匹配规则，用于处理乘负数
mul_sub_p = re.compile(r"(-?\d+)(\.\d+)?(\*-)(-?\d+)(\.\d+)?")
#定义(/-)匹配规则，用于处理除负数
div_sub_p = re.compile(r"(-?\d+)(\.\d+)?(/-)(-?\d+)(\.\d+)?")
#定义括号匹配规则
bracket_p = re.compile(r"\([^()]*\)")
#bracket_p = re.compile(r"\(.*\)")
#print add_p.search(test_str).group()

#定义一个计算2个数的函数，传入一个只能含有1个运算符的表达式，计算后结果返回一个数值字符串
#主要思想是字符串分割，以运算符为标志位分割字符串，转换类型计算
def base_operation(expr_str):
    if expr_str.count("+") == 1:
        left_num = float(expr_str[:expr_str.find("+")])
        right_num = float(expr_str[(expr_str.find("+")+1):])
        return str(left_num + right_num)
    elif expr_str[1:].count("-") == 1:
        left_num = float(expr_str[:expr_str.find("-",1)])
        right_num = float(expr_str[(expr_str.find("-",1)+1):])
        return str(left_num - right_num)
    elif expr_str.count("*") ==1:
        left_num = float(expr_str[:expr_str.find("*")])
        right_num = float(expr_str[(expr_str.find("*")+1):])
        return str(left_num * right_num)
    elif expr_str.count("/") == 1:
        left_num = float(expr_str[:expr_str.find("/")])
        right_num = float(expr_str[(expr_str.find("/")+1):])
        return str(left_num / right_num)

#定义一个做四则加减乘除的函数，只能做不带括号的加减乘除运算(能处理*-、/-这类负数)
#主要思想就是用替换循环处理，直到返回一个不含运算符号的字符串为止
def mixed_operation(expr_str):
    #处理单个正负数，如果输入不含运算符的单个数字，直接返回结果
    if len(re.findall(r"[-+*/]",expr_str[1:])) ==0:
        return expr_str
    #不含加减的乘除运算处理
    elif len(re.findall(r"(\+|-)",expr_str)) == 0 and len(re.findall(r"(\*|/)",expr_str)) != 0:
        while len(re.findall(r"(\*|/)",expr_str)) != 0:
            if len(re.findall(r"(\*-)",expr_str)) != 0:
                expr_str = expr_str.replace(mul_sub_p.search(expr_str).group(),'-'+mul_sub_p.search(expr_str).group().replace("*-","*"))
            if len(re.findall(r"(/-)",expr_str)) != 0:
                expr_str = expr_str.replace(mul_sub_p.search(expr_str).group(),'-'+mul_sub_p.search(expr_str).group().replace("/-","/"))
            expr_str = expr_str.replace(mul_div_p.search(expr_str).group(),base_operation(mul_div_p.search(expr_str).group()))
        return expr_str
    #循环处理同时存在(加减)和(乘除)，优先级低的+、-法后处理，放在循环外面
    elif len(re.findall(r"(\+|-)",expr_str[1:])) != 0:
        while len(re.findall(r"(\+|-)",expr_str[1:])) != 0:
            if len(re.findall(r"(\+-|--)",expr_str)) != 0:
                expr_str = expr_str.replace("+-","-")
                expr_str = expr_str.replace("--","+")
            #优先级高的乘除处理
            while len(re.findall(r"(\*|/)",expr_str)) != 0:
                if len(re.findall(r"(\*-)",expr_str)) != 0:
                    expr_str = expr_str.replace(mul_sub_p.search(expr_str).group(),'-'+mul_sub_p.search(expr_str).group().replace("*-","*"))
                if len(re.findall(r"(/-)",expr_str)) != 0:
                    expr_str = expr_str.replace(mul_sub_p.search(expr_str).group(),'-'+mul_sub_p.search(expr_str).group().replace("/-","/"))
                expr_str = expr_str.replace(mul_div_p.search(expr_str).group(),base_operation(mul_div_p.search(expr_str).group()))
            expr_str = expr_str.replace(add_sub_p.search(expr_str).group(),base_operation(add_sub_p.search(expr_str).group()))
        return expr_str

#定义一个处理括号的函数,没有括号直接返回，有括号替换完全调用mixed_operation函数
def remove_bracket(expr_str=""):
    if len(bracket_p.findall(expr_str)) ==0:
        return mixed_operation(expr_str)
    elif len(bracket_p.findall(expr_str)) !=0:
        while len(bracket_p.findall(expr_str)) !=0:
            expr_str = expr_str.replace(bracket_p.search(expr_str).group(),mixed_operation((bracket_p.search(expr_str).group()[1:-1])))
        return mixed_operation(expr_str)

def main():
    while True:
        input_str = raw_input("Please input your expression.\n>>>")
        expression_str = ''.join([i for i in input_str if i != ' '])
        if len(re.findall(r"[a-zA-Z]",expression_str)) != 0:
            print "your input isn't a arithmetic expression.Bye-Bye"
            break
        else:
            print "%s = %s" %(expression_str,remove_bracket(expression_str))

if __name__ == '__main__':
    main()

   # 1 - 2 * ((60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2))